package persistencia.dao;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;

import persistencia.GAEAgent;
import persistencia.PMF;
import dominio.Producto;



public class ProductoDAO implements Serializable{

	private static final long serialVersionUID = 1L;
	private static final Logger log = Logger.getLogger(Producto.class.getName());
	
	public static boolean create(Producto prod, boolean initOfTransaction, boolean endOfTransaction){
		//comprobar si existe el pruducto con ese nombre
		Producto result=read(prod.getName(), false);
		if(result==null){
			GAEAgent.create(Producto.class,prod, initOfTransaction, endOfTransaction);
			return true;
		}else {
			String details="Clase : Admin, id : "+prod.getId() + " AdditionalInfo : "+ prod.getName();
			log.warning("El Producto ya existe: " + details);
			return false;
		}
		
	}
	
	public static Boolean delete(Long id,boolean partOfTransaction){
		return GAEAgent.delete(Producto.class, id, partOfTransaction);
	}
	
	public static Producto read(String name,Boolean partOfTransaction){
		if(name==null) return null; 
		else {
		LinkedList<Producto> result = GAEAgent.read(Producto.class, "name" , String.class, name, partOfTransaction);
			if(result==null) return null;
			else if (result.size()==0) return null;
			else if (result.size()==1) return result.get(0);
			else{ 
				log.warning("Error al leer, el email est� duplicado");
				return null;
			}
		}
	}
	
	public static LinkedList<Producto> readByUserId(long id_user,Boolean partOfTransaction){
		
		LinkedList<Producto> result = GAEAgent.read(Producto.class, "id_propietario" , Long.class, id_user, partOfTransaction);
		if(result==null) return null;
		else if (result.size()==0) return null;
		else{ 
			return result;
		}
		
	}
	
	public static LinkedList<Producto> readByCategory(long id_category, Boolean partOfTransaction){
		
		LinkedList<Producto> result = GAEAgent.read(Producto.class, "id_categoria" , Long.class, id_category, partOfTransaction);
		if(result==null) return null;
		else if (result.size()==0) return null;
		else{ 
			return result;
		}
	}
	
	
	
	public static LinkedList<Producto> readAll(Boolean partOfTransaction){
		return GAEAgent.readAll(Producto.class, partOfTransaction);
	}
	
	public static Producto read(Long id, Boolean partOfTransaction){
		return GAEAgent.readByID(Producto.class,Long.class, id,partOfTransaction);
	}
	
	public static Producto update(Producto prod, Boolean partOfTransaction) {
		PersistenceManager pmt;
		
		if(!partOfTransaction) pmt=GAEAgent.openNewTransaction();
		else pmt= PMF.get().getPersistenceManager();
		
		Producto a=null;
		try {
			a = pmt.getObjectById(Producto.class,prod.getId());
	        a.setName(prod.getName());
	        a.setDescripcion(prod.getDescripcion());
	        a.setPrecio(prod.getPrecio());
	        a.setStock(prod.getStock());
	    } finally {
	    	if(!partOfTransaction)GAEAgent.closeActualTransaction();
			else pmt.close();
	    }
	    return a;
	}
}
